home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
games
/
itw
/
itw_main.bas
next >
Wrap
BASIC Source File
|
2000-06-04
|
30KB
|
1,083 lines
/** */
/** 『In the Water』 < Ver.1.03 > 1996,2000 TAU Software */
/** */
/* for 「ぺけ-BASIC ver.0.02 H7/11/22版」以降 */
/* */
/******************/
/*** 変数宣言 ***/
/******************/
int cnt_ct,ttm,tms /* コンティニュー回数、トータルタイム・ミス
int energy,e_max,heart /* エネルギー、最大ENERGY値、ハート(REST)
int cursol=0,tl_ck=0 /* カーソル位置(タイトル)、タイトル用チェック
int prac=1,prac_max=1 /* 練習面、最大練習面
int chk_end=0 /* エンディングメッセージ用チェック
int anime_ct=0 /* アニメ用カウンタ
dim int ac2(8)={ 0, 32, 64, 96,128,160,192,224,256}
dim int txd(383) /* PCG DATA (TEXT)
dim int amd(287) /* PCG DATA アニメーション用
dim int vmap(16,13) /* 仮想画面 (0:water 1:koin 2:slime 3:block)
dim int recs(2)={ -1,-1,-1 } /* ベストタイム(トータル)
dim int times(11)={ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 } /* ステージ別タイム
int save_mode=1 /* セーブ(0:OFF 1:ON)
int music_mode=1 /* 音楽(0:OFF 1:ON)
/********************************/
/*** 定数(変数だけど・・・) ***/
/********************************/
int ENERGY_0=64 /* ENERGY: 初期値(1-128)
int EMAX_0=64,ENERGY_MAX=128 /* 最大初期値(1-128)、最大(128)
int HEART_0=3,HEART_MAX=5 /* HEART: 初期値(0-9)、最大(0-9)
int HEART_CONT=3 /* CONTINUE時(0-9)
int E_RCV=1 /* ENERGY 回復量
dim int E_CNS(2,2)={ 2,3,2, 0,0,0, 1,1,1 } /* ENERGY 使用量(key:左上--右上--右下)
int MOVE_WAIT=2 /* 移動・アニメ用ウェイト時間
dim int MV_DAT(3)={ 0,-1,1,0 } /* ジョイパッド -> 移動データ 用
dim str RANKS(2)={ "1ST","2ND","3RD" } /* 順位
dim str FNAME(5)={ "ITW_TXDT.DAT","ITW_PCG.SP", "ITW_PCG.PAL", /* FILES NAME
"ITW_MSD.ZPD", "ITW_MSD.ZMD","ITW_RECS.DAT" }
str HEADER="ITW_RECS"
int R21
R21=wpeek(&hE8002A)
/**************************/
/*** メイン ルーチン ***/
/**************************/
read_file()
init()
main0()
end0()
end
/**********************/
/*** メインループ ***/
/**********************/
func main0()
int z
int stg,rt /* ステージ番号、返り値
repeat
rt=title()
if rt>=0 then{
wpoke(&hE80016,0)
if rt=0 then{
while put_heart(-1)>-1:endwhile
while heart<HEART_0:put_heart(1):endwhile
print_emax(EMAX_0)
energy_ud(0)
cnt_ct=0
tms=0:ttm=0
for stg=1 to 12
rt=game0(stg,0)
if rt<>1 then break
next
if stg>12 then staff()
} else{
print_emax(ENERGY_MAX)
stg=rt:rt=5
while rt>4
while put_heart(-1)>-1:endwhile
while heart<HEART_CONT:put_heart(1):endwhile
energy_ud(0)
rt=game0(stg,1)
if rt=5 or rt=7 then{
z=prac_max
if z>12 and stg<13 then z=12
stg=((stg+5-rt+z) mod z)+1
prac=stg:print_letters(160,364,right$("0"+str$(prac),2))
}
endwhile
}
}
until rt<=0
endfunc
/******************/
/*** 終了処理 ***/
/******************/
func end0()
int i
if music_mode then m_stop()
vpage2(0)
tx_cls(0,0,512,1024)
wpoke(&hE80014,0):wpoke(&hE80016,0)
for i=0 to 8:iocs(&h13,i,-2):next
v_priority("STG")
wpoke(&hE8002A,R21)
endfunc
/******************/
/*** タイトル ***/
/******************/
func title()
int tm,tmw /* タイマ
int pcs,dx,dy /* カーソル位置、移動方向
int z,jd0,jd,pjd /* 雑用、返り値、入力
int stat=0,rt=-1 /* ステイタス、返り値
dim int TM0(1)={1340,1720} /* 画面切替時間
play0(0)
if tl_ck then{
if clear_screen() then return(-1) /* 画面クリア
fill(14,232,141,241,0)
print_letters(72,221," ")
print_letters(208,221,"00")
print_letters(200,236," 0/ 0")
} else tl_ck=1
block_pal(prac-1)
for jd0=1 to 12 /* 左右のキャラ表示
jd=9-((jd0-1) mod 3)*4
print_bg(0,1,jd0,jd):print_bg(0,15,jd0,jd)
next
wpoke(&hE80016,256) /* テキスト画面切替え
play0(1)
tm=iocs(&h7F)
tmw=iocs(&h7F)+MOVE_WAIT
jd0=joy()
while (iocs(4,0) and iocs(4,2) and 2)=0 /* ループ ([ESC]+[Q]:強制終了)
pjd=not(jd0)
jd0=joy():jd=pjd and jd0 /* 入力
if stat=0 then{
dx=MV_DAT((jd shr 2) and 3)
dy=MV_DAT(jd and 3)
if cursol=1 and dx then{ /* 練習面指定
if music_mode then m_play(43)
z=prac_max
if z>12 and prac<13 and (jd0 and 64)=0 then z=12
prac=((prac+dx-1+z) mod z)+1
print_letters(160,364,right$("0"+str$(prac),2))
}
if dy then{ /* カーソル移動
if music_mode then m_play(43)
pcs=cursol:cursol=(cursol+dy+3) mod 3
print_letters(64,cursol*16+348,">")
print_letters(64,+pcs*16+348," ")
}
}
if (jd0 and 2) and stat=1 then tm=iocs(&h7F)
if jd and 32 then{ /* ボタン押下
if stat=0 and (jd0 and 4)=0 then{
if music_mode then m_play(43)
rt=-(cursol/2)
if cursol=1 then rt=prac
break
}
tm=tm+TM0(stat)
}
if diff_time(tm)>TM0(stat) then {
stat=1-stat
v_disp()
wpoke(&hE80016,stat*256+256) /* 画面切替え
play0(stat*4+1)
tm=iocs(&h7F)
}
if diff_time(tmw)>=MOVE_WAIT then{
if not(bpeek(&hE88001) and &h10) then tmw=iocs(&h7F):anime() } /* アニメ
endwhile
return(rt) /* rt= 0:START GAME 1-12:PRACTICE -1:EXIT
endfunc
/***********************/
/*** ゲーム (MAIN) ***/
/***********************/
func game0(stg,md) /* stg: ステージ番号 md:モード(0;通常 1;練習)
int jd,pjd,st,kd /* 入力
int mx,my,mx2,my2,xz,yz,dr /* マイキャラの位置、座標(xz,yz)、向き(dr)
int dx,dy,dz /* 進む方向・距離
int walk,fall,wait,wct,tm,tmw /* 歩行アニメ・落下・ウェイト用、カウンタ、タイマ
int kn,koin,miss,ck /* コイン総数、コイン数、ミス数、チェック
int stat=-2,rt=0 /* ステイタス、返り値
dim str cnt_mes(1)={ "CONTINUE","RETRY" } /* カウント時のメッセージ
dim int mus_dt(14)={2,2,2,2,2,6,6,6,6,4,4,4,7,7,7} /* ステージ別曲目
play0(0)
kd=iocs(4,13)
while (iocs(4,0) and iocs(4,2) and 2)=0 /* ループ([ESC]+[Q]:強制終了)
kd=iocs(4,13)
if (kd and 16) then rt=3:break /* タイトルへ
if stat<>5 and (kd and 1) then{
play0(3)
tm=diff_time(tm)
if pause()=-1 then rt=-1:break
tm=diff_time(tm)
play0(mus_dt(stg-1))
}
switch stat
case -2: /* 初期設定
sp_set(16,0,0)
kn=make_stage(stg)
if kn=-1 then rt=-1 else{ /* 強制終了
koin=0:miss=0
energy_ud(e_max)
print_letters( 96, 84,"STAGE "+right$(" "+str$(stg),2))
print_letters( 96,112,"HEART: "+str$(heart))
play0(mus_dt(stg-1))
tm=iocs(&h7F)
ck=0:stat=-1
}
break
case -1: /* 左上に戻る
mx=1:my=1
xz=24:yz=24:dr=&h4000
walk=0:fall=0:wait=0
sp_set(16,24,24,&h4103,3)
tmw=iocs(&h7F)+MOVE_WAIT
stat=0
case 0: /* メイン
jd=joy()
dx=MV_DAT((jd shr 2) and 3)
dy=MV_DAT(jd and 3)
if dx then dr=-(dx>0)*&h4000
dz=E_CNS(dy+1,dx+1)
if dz then if energy_ud(-dz) then dx=0:dy=0
if ck=0 and diff_time(tm)>240 then tx_cls(92,84,72,36):ck=1
stat=1
dz=2:mx2=mx+dx
if dy then{
fall=0:my2=my+dy
if dx=0 then if dy=-1 then dz=4
if vmap(mx2,my2)=3 then{
if vmap(mx2,my)=3 then dx=0
if vmap(mx2,my)<3 or vmap(mx,my2)=3 then dy=0
}
} else{
my2=my+1
if dx then{
if vmap(mx2,my)=3 then dx=0
dy=-(fall>0 and vmap(mx,my2)<3 and vmap(mx2,my2)<3)
fall=1-fall
} else fall=0:if vmap(mx,my2)<3 then dy=1:dz=1 else stat=2
}
if stat=1 then wct=16/dz:wait=0:tmw=iocs(&h7F)+MOVE_WAIT
break
case 1: /* キャラ移動
if diff_time(tmw) < MOVE_WAIT then break
tmw=iocs(&h7F)
wct=wct-1
if dx or dy=-1 then if (wct and 3)=0 then walk=1-walk
xz=xz+dx*dz:yz=yz+dy*dz
sp_set(16,xz,yz,dr+&h103+walk,3)
anime()
if wct>0 then break
mx=mx+dx:my=my+dy
if vmap(mx,my)=2 then{
if energy_ud(-e_max/8) then energy_ud(0) /* ミス
tx_cls(92,84,72,36):ck=1
if music_mode then m_play(42)
wct=0:stat=3
} else{
stat=0
if vmap(mx,my)=1 then{
vmap(mx,my)=0:print_bg(0,mx,my,0) /* コインを取る
if music_mode then m_play(41)
koin=koin+1:print_letters(200,236,right$(" "+str$(koin),2))
if koin=kn then{
tm=diff_time(tm):if tm>600000 then tm=600000
ttm=ttm+tm:if ttm>600000 then ttm=600000
tx_cls(92,84,72,36)
play0(9)
stage_clear(stg,tm,miss,md) /* クリア
tm=iocs(&h7F)
wct=10-(md=0):walk=0:stat=5
jd=joy()
}
}
}
tmw=iocs(&h7F)+MOVE_WAIT
break
case 2: /* キャラ停止中
if diff_time(tmw) < MOVE_WAIT then break
tmw=iocs(&h7F)
wait=wait+1:if wait>15 then wait=8
if wait=8 then sp_set(16,xz,yz,257,3)
if wait=12 then sp_set(16,xz,yz,258,3)
anime()
if wait=15 then energy_ud(E_RCV)
stat=0
break
case 3: /* ミス(落下アニメ)
if bpeek(&hE88001) and &h10 then break
sp_set(16,xz,yz,&h105+(wct shr 2),3)
anime()
wct=(wct+1) and 7:yz=yz+2
if yz>216 then{
if miss<100 then miss=miss+1
if tms<100 then tms=tms+1
if put_heart(-1)<0 then{
play0(10)
ttm=ttm+diff_time(tm):if ttm>600000 then ttm=600000
print_letters( 92, 84,"GAME OVER")
print_letters( 80+md*12,112,cnt_mes(md)+"? 10")
tm=iocs(&h7F)
walk=-1:wct=10:stat=5:jd=joy()
tmw=iocs(&h7F)+MOVE_WAIT
} else{
print_letters( 92, 84,"MISTAKE !")
print_letters( 96,112,"HEART: "+str$(heart))
wct=150:stat=4
}
}
break
case 4:
if diff_time(tmw) < MOVE_WAIT*10 then break
if bpeek(&hE88001) and &h10 then break
wct=wct-1:anime()
if wct=0 then tx_cls(92,84,72,36):ck=1:stat=-1
break
case 5: /* GAME END
if (bpeek(&hE88001) and &h10) then break
if walk>=0 then{
if diff_time(tmw) >= MOVE_WAIT then{
tmw=iocs(&h7F)
walk=walk+1:if walk>3 then walk=0
sp_set(16,xz,yz,&h105+walk/2,3) /* わーい!
}
}
anime() /* アニメ
pjd=not(jd):jd=joy() /* 入力
st=pjd and jd
if wct<11 then{
if (jd and 2) then tm=iocs(&h7F)
if diff_time(tm)>100 or (st and 8) then{ /* TIME COUNT
wct=wct-1
if wct<0 then rt=2:break
mx2=148:my2=148:if walk<0 then mx2=160+(md<>0)*12:my2=112
if music_mode then m_play(43)
print_letters(mx2,my2," "+str$(wct))
tm=iocs(&h7F)
}
}
if st and 32 then{
if music_mode and wct<11 then m_play(43)
if (jd and 4) then rt=3:break
if md and walk>=0 then if (jd and 3) then rt=6+MV_DAT(jd and 3):break
if md or walk<0 then{
if cnt_ct<100 then cnt_ct=cnt_ct+1
while heart<HEART_CONT:put_heart(1):endwhile /* CONTINUE
stat=-2
} else rt=1
}
if md=0 and walk=0 then if diff_time(tm)>800 then rt=1
break
endswitch
if rt then break
endwhile
if rt>0 then{ /* アニメ調整
while anime_ct<8
if (iocs(4,0) and iocs(4,2) and 2) then rt=-1:break
anime()
endwhile
}
return(rt) /* rt= 1:CLEAR 2:GAME OVER 3:GO TO TITLE -1 or 0:[ESC]+[Q]
endfunc
/******************/
/*** 一時停止 ***/
/******************/
func pause()
int jd,pjd,rt=-1 /* 入力、返り値
dim int td0(81)={4718628},td1(81)={4718628},td2(81)={4718628}
iocs(&h15,1):iocs(&h1A,92,84,,,,td0)
iocs(&h15,2):iocs(&h1A,92,84,,,,td1)
iocs(&h15,4):iocs(&h1A,92,84,,,,td2)
tx_cls(92,84,72,36)
print_letters(100,100,"PAUSE !")
jd=(((joy() shr 5) or iocs(4,13)) and 1)
while (iocs(4,0) and iocs(4,2) and 2)=0
pjd=(not jd)
jd=(((joy() shr 5) or iocs(4,13)) and 1)
if (jd and pjd) then rt=0:break
endwhile
if rt=0 then{
rt=-1
while (iocs(4,0) and iocs(4,2) and 2)=0
if (((joy() shr 5) or iocs(4,13)) and 1)=0 then rt=0:break
endwhile
}
iocs(&h15,1):iocs(&h1B,92,84,,,,td0)
iocs(&h15,2):iocs(&h1B,92,84,,,,td1)
iocs(&h15,4):iocs(&h1B,92,84,,,,td2)
return(rt)
endfunc
/************************/
/*** ステージクリア ***/
/************************/
func stage_clear(stg,tm,ms,md) /* stg: ステージ番号 tm: CLEAR_TIME ms: MISS md: MODE
int z,sv=0
dim str end_mes(1)={ "GO TO NEXT STAGE","GO TO ENDING!" }
print_letters( 64, 44,"STAGE "+right$("0"+str$(stg),2)+" CLEAR!")
print_letters( 72, 68,"TIME:"):print_time(120, 68,tm)
if md=0 and stg<13 then{
z=stg-1
if tm<times(z) or times(z)=-1 then{
print_letters( 48, 84,"YOUR RECORD IS BEST!")
print_time((z/6)*104+54,(z mod 6)*14+620,tm)
times(z)=tm:sv=1
}
}
if prac_max<=stg and stg<12 and md=0 then prac_max=stg+1:sv=1
if sv then save_rec()
if ms=0 then{
print_letters( 72,124,"NO MISS CLEAR!")
if stg<12 and md=0 then{
if print_emax(e_max+16)=0 then print_letters( 52,140,"MAX.ENERGY RISE UP!") else {
if put_heart(1)<=0 then print_letters( 44,140,"YOUR HEART INCREASES!") }
}
} else print_letters( 96,124,"MISS: "+right$("0"+str$(ms),2))
if md then print_letters( 92,148,"RETRY? 10")
if md=0 then md=-(stg=12):print_letters(96+md*24,180,end_mes(md))
endfunc
/************************/
/*** スタッフロール ***/
/************************/
func staff()
int i
int jd,pjd,sv=0 /* 入力(jd,pjd)、セーブチェック
int no=3,tm,rt=0 /* 順位、タイマ、返り値
int TM0=780,TM1=3000 /* 待時間
vpage2(&h20)
wpoke(&hE80014,256):wpoke(&hE80016,0) /* text scroll
play0(0)
tm=iocs(&h7F)
print_letters(456,904,right$("0"+str$(cnt_ct),2))
print_letters(456,918,right$("0"+str$(tms),2))
print_time(408,936,ttm)
while ttm<recs(no-1) or recs(no-1)=-1
if no<3 then recs(no)=recs(no-1):print_time(66+no*44,557+no*14,recs(no))
recs(no-1)=ttm:print_time(22+no*44,543+no*14,ttm)
no=no-1:if no=0 then break
endwhile
tx_cls(344,958,144,8)
if no<3 then print_letters(344,958,"YOUR TIME IS "+RANKS(no)+"!"):sv=1
if prac_max<15 then prac_max=15:sv=1
if prac_max=15 and chk_end=0 then{
chk_end=1
print_letters(256,1016,"PUSH B BUTTON WHEN SELECT STAGE!")
} else tx_cls(256,1016,256,8)
play0(8)
fill(14,232,141,241,0)
print_letters(72,221," ")
print_letters(208,221,"00")
print_letters(200,236," 0/ 0")
if clear_screen() then return(-1)
tl_ck=0
while (diff_time(tm))<TM0
if (iocs(4,0) and iocs(4,2) and 2) then rt=-1:break
endwhile
if rt=0 then{
for i=0 to 800 /* スクロール
if (iocs(4,0) and iocs(4,2) and 2) then rt=-1:break
if (iocs(4,13) and 16) then rt=1:break /* タイトルへ
v_disp()
wpoke(&hE80016,i)
next
}
if rt=0 then{
if sv then save_rec()
tm=iocs(&h7F):jd=joy()
while (diff_time(tm))<TM1 /* ウエイト
if (iocs(4,0) and iocs(4,2) and 2) then rt=-1:break
if (iocs(4,13) and 16) then break
pjd=not(jd):jd=joy():if (pjd and jd) and 32 then break
if (jd and 2) then tm=iocs(&h7F)
endwhile
}
if rt>=0 then{
vpage2(&h6F) /* 通常画面に直す
wpoke(&hE80014,0):wpoke(&hE80016,0)
}
return(rt) /* rt=-1:[ESC]+[Q]
endfunc
/************************************************/
/*** オプション読取、ファイルチェック・読込 ***/
/************************************************/
func read_file()
int i,z
int r0=1,m0=0 /* file read, music / (0:off 1:on)
int err=0,fp /* error, file No.
/*** オプション読取り ***/
for i=1 to b_argc-1
z=asc(mid$(b_argv(i),1,1))
if len(b_argv(i))=2 and (z='/' or z='-') then{
z=asc(mid$(b_argv(i),2,1))
if z='s' or z='S' then save_mode=0 /* /S: 書込禁止
if z='z' or z='Z' then music_mode=0 /* /Z: 演奏停止
}
next
/*** ファイルチェック ***/
for i=0 to 5
if music_mode=0 and (i=3 or i=4) then continue
if i=5 and m0 then if y_n("音楽ないけど、いい") then music_mode=0 else end
if filesnum(FNAME(i),&h21)<>1 then{
print"「"+FNAME(i)+"」が、ないみたい!"
if i<3 then err=1 else if i<5 then m0=1
if i=5 and err=0 then{
r0=0:if save_mode=0 then break
save_mode=0
if (drvctrl(0) and 14)=2 then{
if y_n("新しい記録ファイル、作る") then{
fp=fopen(FNAME(5),"c")
fwrites(HEADER,fp)
fputc(0,fp):fputc(0,fp):fputc(0,fp)
fputc(prac_max,fp)
fwrite(recs,3,fp):fwrite(times,12,fp)
fclose(fp)
r0=1:save_mode=1
}
}
}
}
next
if err then print"起動に失敗しちゃった!":end
/*** レコード読込 ***/
if r0 then{
fp=fopen(FNAME(5),"r")
fseek(fp,11,0):prac_max=fgetc(fp)
fread(recs,3,fp):fread(times,12,fp)
fclose(fp)
}
endfunc
/*******************/
/*** Yes or No ***/
/*******************/
func y_n(mes;str)
str zs
print mes+"?(Y/N) <中断:[ESC]> ";
zs=inkey$
if asc(zs)=&h1B then end
print zs
return(zs="y" or zs="Y")
endfunc
/************************/
/*** レコードセーブ ***/
/************************/
func save_rec()
int fp
if save_mode then{
if (drvctrl(0) and 14)=2 then{
if filesnum(FNAME(5),&h20) then{
fp=fopen(FNAME(5),"w")
fseek(fp,11,0):fputc(prac_max,fp)
fwrite(recs,3,fp):fwrite(times,12,fp)
fclose(fp)
}
}
}
endfunc
/******************/
/*** 初期設定 ***/
/******************/
func init()
int i,j,k,z /* 雑用
int fp /* file No.
dim char suf(24),td(11)={0,8,0,8} /* PCG DATA(TEXT) suf: 水面 td: 表示用
dim int tp(1015),std(23)={3670029},tid(117)={11010070}
dim int tpal(15)={ 0, 832, 32384, 38664, 51020, 63454, 35578, 50558, /* TEXT PALET
+ 0, 16400, 64766, 60474, 56182, 51890, 47662, 43434 }
dim str sf0(7)={ "CHARACTOR DESIGNER","","FONT DESIGNER","MUSIC BY", /* STAFF
"SOUND BY","","PEKE-BASIC BY","PROGRAMMER" }
/*** 音楽 ***/
if music_mode then{
m_init()
m_adpcm_block(FNAME(3))
zmd_play(FNAME(4))
play0(3)
}
/*** 画面設定 ***/
screen 0,3,1,1
vpage2(0) /* 表示 OFF
tx_cls(0,0,512,1024) /* テキスト画面クリア
v_priority("TSG") /* プライオリティ設定
/*** テキスト設定 ***/
fp=fopen(FNAME(0),"r")
fread(txd,384,fp):fread(suf,24,fp) /* DATA 読込み
fread(tp,1016,fp)
fclose(fp)
for i=0 to 15:wpoke(&hE82200+i*2,tpal(i)):next /* TEXT PALET 設定
/*** スプライト設定 ***/
sp_init()
spfile_def(FNAME(1),1) /* PCG 定義
palfile_def(FNAME(2),1) /* PALET 定義
block_pal(11)
fp=fopen(FNAME(1),"r")
fseek(fp, 896,0):fread(amd,288,fp) /* アニメ用
fclose(fp)
sp_clr(0) /* PCG0 クリア
sp_disp(0) /* SPRITE & BG 非表示
/*** BG 面設定 ***/
bg_fill(0,0):bg_fill(1,0) /* BG面 クリア
bg_set(0,0,1):bg_set(1,1,1) /* BG面 設定
bg_scroll(0,0,0):bg_scroll(1,0,0)
/*** 仮想画面周囲設定 ***/
for i=0 to 16:vmap(i,0)=3:vmap(i,13)=3:next
for j=1 to 12:vmap(0,j)=3:vmap(16,j)=3:next
/*** 初期画面描画 ***/
for i=0 to 15
bg_put(0,i*2, 0,1311):bg_put(0,i*2+1, 0,1309) /* 枠 (BG)
bg_put(0,i*2,31,1310):bg_put(0,i*2+1,31,1308)
bg_put(0, 0,i*2,1311):bg_put(0, 0,i*2+1,1310)
bg_put(0,31,i*2,1309):bg_put(0,31,i*2+1,1308)
next
for i=0 to 14:sp_set(i,i*16+24,216,1287,3):next /* 枠 (SPRITE)
for i=1 to 30
z=1-(i and 1)
bg_put(1,i,1,1094+z)
for j=0 to 11
if j>0 then bg_put(1,i,j*2+1,1096+z) /* 背景 (BG)
bg_put(1,i,j*2+2,1098+z)
next
next
for j=0 to 2
for i=0 to 7:td(i+4)=suf(j*8+i):next
iocs(&h15,1 shl j)
for z=0 to 2:for i=1 to 30
iocs(&h1B,i*8,z*256+8,,,,td) /* 水面 (TEXT)
next:next
next
fill(8,216,247,247,8360) /* ステイタス (GRAPHIC)
fill(13,231,142,242,63420)
fill(14,232,141,241,0)
for j=0 to 2
print_letters(12,j*256+221,"ENERGY") /* ステイタス(文字)
print_letters(160,j*256+221,"STAGE 00")
print_letters(160,j*256+236,"COIN 0/ 0")
next
for k=0 to 3 /* タイトル画面(チープでごめんね!)
for i=0 to 115:tid(i+1)=tp(k*116+i+552):next
iocs(&h15,1 shl k):iocs(&h1B, 44,298,,,,tid)
iocs(&h15,1 shl k):iocs(&h1B,300, 80,,,,tid)
next
print_letters( 64,348,"> START GAME")
print_letters( 80,364,"PRACTICE "+right$("0"+str$(prac),2))
print_letters( 80,380,"EXIT")
print_letters( 60,416,"1996,2000")
print_letters(112,428,"TAU SOFTWARE")
print_letters(256,1004,"THANK YOU FOR PLAYING THIS GAME!")
/*** BEST RECORDS 画面 ***/
print_letters( 48,540,"@@@ BEST RECORDS @@@")
for i=0 to 2
print_letters(36+i*44,557+i*14,RANKS(i))
print_time(66+i*44,557+i*14,recs(i))
next:RANKS(0)="BEST"
print_letters( 28,604,"STAGE"):print_letters(132,604,"STAGE")
for i=0 to 1:for j=0 to 5
z=i*6+j
print_letters(i*104+32,j*14+620,right$("0"+str$(z+1),2)+":")
print_time(i*104+54,j*14+620,times(z))
next:next
/*** STAFF ROLL 画面 ***/
print_letters(348,112,"[STAFF]")
j=268:for i=0 to 7
if sf0(i)="" then j=j-44 else print_letters(304,j,sf0(i)):j=j+20
for k=0 to 2
for z=0 to 22:std(z+1)=tp(i*69+k*23+z):next
iocs(&h15,1 shl k):iocs(&h1B,408,j,,,,std)
next:j=j+64
next
print_letters(280,856,"PRODUCT BY TAU SOFTWARE")
print_letters(416,868,"1996,2000")
print_letters(376,904,"CONTINUE:")
print_letters(360,918,"TOTAL MISS:")
print_letters(312,936,"TOTAL TIME:")
/*** 表示 ***/
sp_disp(1)
vpage2(&h6F)
endfunc
/******************************************/
/*** コイン、ブロック、スライムの配置 ***/
/******************************************/
func make_stage(stg) /* stg: ステージ番号
int i,j,x,y
int kc,kn /* コイン配置数、コイン数
/*** 配置数・ステージ数・乱数の設定 ***/
kc=5
randomize(13534)
for i=1 to stg-1
for j=0 to kc
x=rnd():y=rnd()
next
kc=(kc+2)*1.25-1.5
next
/*** ゲーム画面の作成 ***/
if clear_screen() then return(-1) /* ゲーム画面クリア
block_pal(stg-1) /* ブロックのパレット設定
print_letters(208,221,right$(" "+str$(stg),2)) /* ステージ数の表示
print_letters(200,236," 0/ 0") /* コイン表示クリア
kn=0
for i=1 to kc
if (iocs(4,0) and iocs(4,2) and 2) then kn=-1:break /* 強制終了
x=rnd()*13+2:y=rnd()*10+2
if vmap(x,y)<>1 then{
print_bg(0,x,y,2+((x+y) mod 6)) /* コインの表示
vmap(x,y)=1
kn=kn+1
print_letters(224,236,right$(" "+str$(kn),2)) /* コイン数の表示
}
if vmap(x,y+1)=0 then print_bg(0,x,y+1,1):vmap(x,y+1)=3 /* ブロック
if vmap(x,y-1)=0 then print_bg(0,x,y-1,8+((x+y) mod 3)):vmap(x,y-1)=2 /* スライム
next:x=rnd():y=rnd()
return(kn) /* コイン数返す(-1:[ESC]+[Q])
endfunc
/*****************************************/
/*** 入力(キーボード&ジョイパッド) ***/
/*****************************************/
func joy()
int k3,k6,k7,k8,k9,kE,jd
k3=iocs(4,3):kE=iocs(4,14)
k6=iocs(4,6):k7=iocs(4,7)
k8=iocs(4,8):k9=iocs(4,9)
jd=not(iocs(&h3B,0)) and &h00FF /* ジョイパッド
jd=jd or (((k7 or k8) shr 4) and 1) /* 上
jd=jd or (((k7 shr 5) or (k9 shr 3)) and 2) /* 下
jd=jd or (((k7 shr 1) or (k8 shr 5)) and 4) /* 左
jd=jd or (((k7 shr 2) or (k9 shl 2)) and 8) /* 右
jd=jd or ((k3 or k6 or (k9 shr 1) or (k9 shl 5)) and 32) /* ボタン(A)
jd=jd or (((kE shl 4) or (k9 shr 1)) and 64) /* ボタン(B)
return(jd)
endfunc
/****************/
/*** 時間差 ***/
/****************/
func diff_time(tm)
return((iocs(&h7F)-tm+8640000) mod 8640000)
endfunc
/********************/
/*** 拡張 vpage ***/
/********************/
func vpage2(vp)
bpoke(&hE82601,vp and &hFF)
endfunc
/******************************************/
/*** コイン&スライムのアニメーション ***/
/******************************************/
func anime()
int i
dim int amd2(31)
for i=0 to 31:amd2(i)=amd(ac2(anime_ct)+i):next
iocs(&hC4,anime_ct+8,1,,,,amd2) /* PCG再定義
anime_ct=anime_ct+1:if anime_ct=9 then anime_ct=0
ac2(anime_ct)=ac2(anime_ct)+32
if ac2(anime_ct)=288 then ac2(anime_ct)=192 else if ac2(anime_ct)=192 then ac2(anime_ct)=0
endfunc
/********************************/
/*** ブロックのパレット設定 ***/
/********************************/
func block_pal(no)
int i,cl
for i=2 to 5
if no<12 then cl=hsv(no*16,17-i,i*5+3) else cl=hsv((no mod 3)*64+16,12+i,31-i*5)
sp_color(i,cl,5)
next
endfunc
/*****************/
/*** BG 描画 ***/
/*****************/
func print_bg(pn,x,y,no) /* pn : プレーン No. x,y: 座標 no: 描画パターン
int i
dim int pal_block(10)={ 0, 5, 2, 2, 2, 2, 2, 2, 3, 3, 3 } /* 描画パレットブロック
x=x*2-1:y=y*2-1 /* 座標修正
no=pal_block(no)*256+no*4 /* パターンデータ算出
if no>0 then no=no+24
for i=0 to 3
bg_put(pn,x+(i/2),y+(i and 1),no+i) /* 描画
next
endfunc
/**************************/
/*** HEART(REST) 表示 ***/
/**************************/
func put_heart(ud) /* ud: 増減値(ud<0:-1 ud>0:+1 ud=0: 初期表示(heart=HEART_0))
int x
str ch="@"
if ud>0 then ud=1 else ud=-1
if heart+ud<0 or heart+ud>HEART_MAX then return(ud) /* 最小(-1)、最大(1)
heart=heart+ud
x=144-heart*8
if ud<0 then x=x-8:ch=" "
print_letters(x,221,ch) /* 表示
return(0)
endfunc
/***************************/
/*** ENERGY METER 表示 ***/
/***************************/
func energy_ud(ud) /* ud: 増減値 (ud=0 クリア)
int i,x,cl,sign
if ud=0 then energy=0:fill(14,232,13+e_max,241,0):return(-1) /* energy=0
sign=1
if ud<0 then{
if energy+ud<0 then return(-1) /* energy<0 の時 -1 返す
sign=-1:ud=-ud
}
for i=1 to ud
if sign>0 and energy>=e_max then break
x=energy+13:cl=0
energy=energy+sign
if sign>0 then x=x+1:cl=hsv(energy,31,24)
line(x,232,x,241,cl) /* 表示
next
return(0)
endfunc
/***************************/
/*** ENERGY 最大値表示 ***/
/***************************/
func print_emax(mx) /* mx: e_max 値
int rt=0
if mx>ENERGY_MAX then mx=ENERGY_MAX:rt=-1
if energy<mx then fill(14+energy,232,13+mx,241,0)
if mx<ENERGY_MAX then fill(14+mx,232,13+ENERGY_MAX,241,8360)
e_max=mx
return(rt) /* -1: e_max>ENERGY_MAX
endfunc
/********************/
/*** タイム表示 ***/
/********************/
func print_time(x,y,tm) /* x,y: 始点座標 tm: タイム( -1; --'--.-- )
str tm_st="**'**.**" /* タイム表示用文字列
if tm<600000 then{
if tm>=0 then{
tm_st=right$(" "+str$(tm/6000),2)+"'"
tm_st=tm_st+right$("0"+str$((tm/100) mod 60),2)+"."+right$("0"+str$(tm mod 100),2)
} else tm_st="--'--.--"
}
print_letters(x,y,tm_st)
endfunc
/*************************/
/*** 文字表示 (TEXT) ***/
/*************************/
func print_letters(x,y,st;str)
int lc,ch,pn
dim int td(2)={524296},td2(2)={524296} /* xl=8:yl=8
for lc=1 to len(st)
ch=asc(mid$(st,lc,1))*2-64
td2(1)=0:td2(2)=0
for pn=0 to 2
td(1)=txd(pn*128+ch):td(2)=txd(pn*128+ch+1) /* 文字 PCG 読込み
td2(1)=td2(1) or td(1):td2(2)=td2(2) or td(2)
iocs(&h15,1 shl pn):iocs(&h1B,x,y,,,,td) /* 文字表示
next
x=x+8
next
endfunc
/**************************/
/*** ゲーム画面クリア ***/
/**************************/
func clear_screen()
int i,j,rt=0
sp_set(16,0,0) /* スプライトクリア
tx_cls(8,24,240,176) /* テキストクリア
for j=1 to 12:for i=1 to 15
if (iocs(4,0) and iocs(4,2) and 2) then rt=-1:break /* 強制終了
vmap(i,j)=0:print_bg(0,i,j,0) /* ゲーム画面のクリア
next:next
return(rt) /* rt= 0:正常終了 -1:強制終了
endfunc
/****************************/
/*** テキスト画面クリア ***/
/****************************/
func tx_cls(x0,y0,xl,yl) /* x0,y0: 始点 xl,yl: 大きさ
dim int td(16384)
td(0)=xl*65536+yl
wpoke(&hE8002A,&h1F0) /* TEXT 同時アクセス
iocs(&h15,1) /* TCOLOR
iocs(&h1B,x0,y0,,,,td) /* TEXTPUT
wpoke(&hE8002A,0)
endfunc
/******************/
/*** 音楽演奏 ***/
/******************/
func play0(no) /* 曲番号 ( 0:fade out )
if music_mode then{
if no>0 and no<11 then{
m_stop()
m_fadeout(0)
m_play(no*4-3,no*4-2,no*4-1,no*4)
} else m_fadeout(85)
}
endfunc